#include"Calculate.hpp"
#include"Parser.hpp"
#include"TcpServer.hpp"
#include"Deamon.hpp"
#include<memory>
#include<unistd.h>

void Usage(std::string proc)
{
    std::cout << "Usage " << "serverport"<<std::endl;
}

//对Test 中的方法进行封装，实现类->Parser,专门做文字解析的工作
//Calculate --> 来处理解析出来的数据
// std::string Test(std::string& inbuffer)
// {
//     //1、从 inbuffer 中获取完整的报文
//     std::string jsonstr;
//     int n = Protocol::Unpack(inbuffer , &jsonstr);
//     if(n==0) return std::string();
//     else if(n <0)
//     {
//         //协议有错，终止进程
//         exit(0);
//     }

//     //2、对报文中的json 进行反序列
//     Request req;
//     if(!req.Deserialize(jsonstr))
//     {
//         return std::string();
//     }

//     //3、执行任务，得到result json串,序列化
//     Responce resp =  handler();//执行任务的函数
//     std::string resp_json;
//     if(!resp.Serialize(&resp_json))
//     {
//         return std::string();
//     }
//     //4、将result 进行打包
//     std::string send_str = Protocol::Package(resp_json);

//     //5、发送回去
//     return send_str;
// }

//./server port
int main(int argc , char* argv[])
{
    if(argc != 2)
    {
        Usage(argv[0]);
        return 0;
    }

    //守护进程
    Deamon();
    
    // EnableConsoleLogStrategy();
    EnableFileLogStrategy();
    uint16_t port = std::stoi(argv[1]);

    //处理任务层 -> 应用层
    std::unique_ptr<Calculate> cal = std::make_unique<Calculate>();

    //协议解析的模块 -> 表示层,需要传递处理解析好之后数据的方法
    std::unique_ptr<Parser> parser = std::make_unique<Parser>(
        [&cal](Request& req)->Responce{ 
            return cal->Exec(req);
        }
    );

    //网络通信模块
    std::unique_ptr<TcpServer> tsock = std::make_unique<TcpServer>(port,
        [&parser](std::string& inbuffer)->std::string{
            return parser->Parse(inbuffer);
        });
    tsock->Run();
    
    // std::unique_ptr<TcpServer> svr = std::make_unique<TcpServer>(port , Test);
    // svr->Run();
    return 0;
}